package cn.cjxy.springboot_zonghe_practice.controller;

import cn.cjxy.springboot_zonghe_practice.domain.Dept;
import cn.cjxy.springboot_zonghe_practice.query.BaseQuery;
import cn.cjxy.springboot_zonghe_practice.service.DeptService;
import cn.cjxy.springboot_zonghe_practice.utils.R;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 部门管理控制器
 * 提供部门相关的RESTful API接口
 * 包括部门的增删改查、分页查询、批量操作等功能
 * 
 * @author huangjie
 * @since 2025-07-06
 */
@RestController
@RequestMapping("/dept")
public class DeptController {
    
    /**
     * 部门服务层
     */
    @Autowired
    private DeptService deptService;

    /**
     * 添加部门
     * 
     * @param dept 部门信息对象（JSON格式）
     * @return 操作结果
     * 
     * @apiNote 请求示例：
     * POST /dept
     * {
     *   "deptName": "技术部",
     *   "deptManager": "张三",
     *   "number": 100,
     *   "deptManagerId": 1
     * }
     */
    @PostMapping
    public R addDept(@RequestBody Dept dept){
        return deptService.addDept(dept);
    }

    /**
     * 修改部门信息
     * 
     * @param dept 部门信息对象（必须包含id）
     * @return 操作结果
     * 
     * @apiNote 请求示例：
     * PUT /dept
     * {
     *   "id": 1,
     *   "deptName": "技术部",
     *   "deptManager": "李四",
     *   "number": 120,
     *   "deptManagerId": 2
     * }
     */
    @PutMapping
    public R updateDept(@RequestBody Dept dept){
        return deptService.updateDept(dept);
    }

    /**
     * 根据ID删除部门
     * 注意：只有没有员工的部门才能被删除
     * 
     * @param id 部门ID（路径参数）
     * @return 操作结果
     * 
     * @apiNote 请求示例：DELETE /dept/1
     */
    @DeleteMapping("/{id}")
    public R delDeptById(@PathVariable("id") Long id){
        return deptService.delDeptById(id);
    }

    /**
     * 根据ID查询部门信息
     * 
     * @param id 部门ID（路径参数）
     * @return 部门详细信息
     * 
     * @apiNote 请求示例：GET /dept/1
     */
    @GetMapping("/{id}")
    public R selectById(@PathVariable("id") Long id){
        return deptService.selectById(id);
    }

    /**
     * 查询所有部门
     * 
     * @return 所有部门列表
     * 
     * @apiNote 请求示例：GET /dept/All
     */
    @GetMapping("/All")
    public R selectAll(){
        return deptService.selectAll();
    }
    
    /**
     * 分页查询部门
     * 
     * @param query 分页查询参数（currentPage: 页码, pageSize: 每页大小）
     * @return 分页结果，包含部门列表、总数、当前页码、每页大小
     * 
     * @apiNote 请求示例：GET /dept/page?currentPage=1&pageSize=10
     */
    @GetMapping("/page")
    public R selectDeptByPage(BaseQuery query) {
        return deptService.selectDeptByPage(query);
    }
    
    /**
     * 批量添加部门
     * 
     * @param depts 部门列表（JSON数组格式）
     * @return 操作结果
     * 
     * @apiNote 请求示例：
     * POST /dept/batch
     * [
     *   {
     *     "deptName": "技术部",
     *     "deptManager": "张三",
     *     "number": 100
     *   },
     *   {
     *     "deptName": "人事部",
     *     "deptManager": "李四",
     *     "number": 50
     *   }
     * ]
     */
    @PostMapping("/batch")
    public R batchAddDept(@RequestBody List<Dept> depts) {
        return deptService.batchAddDept(depts);
    }
    
    /**
     * 批量删除部门
     * 注意：只有没有员工的部门才能被删除
     * 
     * @param ids 部门ID列表（JSON数组格式）
     * @return 操作结果
     * 
     * @apiNote 请求示例：
     * DELETE /dept/batch
     * [1, 2, 3]
     */
    @DeleteMapping("/batch")
    public R batchDeleteDept(@RequestBody List<Long> ids) {
        return deptService.batchDeleteDept(ids);
    }
}